package com.wongoing.sys.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.wongoing.base.Json;
import com.wongoing.base.PageResult;
import com.wongoing.sys.model.SysCode;
import com.wongoing.sys.model.ext.SysCodeExt;
import com.wongoing.sys.service.SysCodeService;
import com.wongoing.sys.util.Constants;
import com.wongoing.sys.viewmodel.JsonResult;
import com.wongoing.util.LogService;
import com.wongoing.util.ModelAndViewConstants;
import com.wongoing.util.PageUtil;

@Controller
@RequestMapping("/sys/sysCodeAction")
public class SysCodeAction extends BaseAction {
	private SysCodeService service;

	@Autowired
	public void setService(SysCodeService service) {
		this.service = service;
	}

	/**
	 * 功能说明： 获取码表分页显示数据 修改说明：
	 * 
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:22:08
	 * @param pageSize
	 * @param pageCurrent
	 * @param orderField
	 * @param orderDirection
	 * @param paramCodeType
	 * @param paramCodeName
	 * @param paramCodeValue
	 * @param paramRemark
	 * @return
	 */
	@RequestMapping(value = "/toList")
	public ModelAndView toList(Integer pageSize, Integer pageCurrent, String orderField, String orderDirection,
			String paramCodeType, String paramCodeName, String paramCodeValue, String paramRemark) {
		ModelAndView mv = null;
		try {
			mv = new ModelAndView();
			PageResult<SysCodeExt> pageResult = PageUtil.pageSet(this.getClass(), pageSize, pageCurrent, orderField,
					orderDirection);
			// 非通用判断条件
			pageResult.getParam().put("status", "0");
			// 模糊查询判断
			List<Boolean> multiFuzzyQuery = new ArrayList<Boolean>();
			if (paramCodeType != null && !"".equals(paramCodeType)) {
				pageResult.getParam().put("codeType", paramCodeType);
				pageResult.setOrderField("CodeType");
				pageResult.setOrderDirection("DESC");
				pageResult.getExt().put("paramCodeType", paramCodeType);
				multiFuzzyQuery.add(true);
			} else {
				multiFuzzyQuery.add(false);
			}
			if (paramCodeName != null && !"".equals(paramCodeName)) {
				pageResult.getParam().put("codeName", paramCodeName);
				pageResult.setOrderField("CodeName");
				pageResult.setOrderDirection("DESC");
				pageResult.getExt().put("paramCodeName", paramCodeName);
				multiFuzzyQuery.add(true);
			} else {
				multiFuzzyQuery.add(false);
			}
			if (paramCodeValue != null && !"".equals(paramCodeValue)) {
				pageResult.getParam().put("codeValue", paramCodeValue);
				pageResult.setOrderField("CodeValue");
				pageResult.setOrderDirection("DESC");
				pageResult.getExt().put("paramCodeValue", paramCodeValue);
				multiFuzzyQuery.add(true);
			} else {
				multiFuzzyQuery.add(false);
			}
			if (paramRemark != null && !"".equals(paramRemark)) {
				pageResult.getParam().put("remark", paramRemark);
				pageResult.setOrderField("Remark");
				pageResult.setOrderDirection("DESC");
				pageResult.getExt().put("paramRemark", paramRemark);
				multiFuzzyQuery.add(true);
			} else {
				multiFuzzyQuery.add(false);
			}
			if (PageUtil.multiFuzzyQuery(multiFuzzyQuery)) {
				pageResult.setOrderField("Id");
				pageResult.setOrderDirection("ASC");
			}
			pageResult = this.service.getSysCodeListPageResult(pageResult);
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.PAGE_RESULT, pageResult);
			mv.setViewName(ModelAndViewConstants.CODE_MAIN_VIEW);
			LogService.getInstance(this).debug("码表分页数据列表获取成功：" + ModelAndViewConstants.CODE_MAIN_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("分页获取码表列表失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}

	/**
	 * 功能说明：进入添加界面 修改说明：
	 * 
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:22:33
	 * @return
	 */
	@RequestMapping(value = "/toAdd")
	public ModelAndView toAdd() {
		ModelAndView mv = null;
		try {
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY, ModelAndViewConstants.OPERATION_VALUE_ADD);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "添加码表值");
			mv.setViewName(ModelAndViewConstants.CODE_EDIT_VIEW);
			LogService.getInstance(this).debug("进入角色添加页：" + ModelAndViewConstants.ROLE_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("角色插入失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}

	/**
	 * 功能说明：进入编辑界面 修改说明：
	 * 
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:23:07
	 * @param id
	 * @return
	 */
	@RequestMapping(value = "/toEdit")
	public ModelAndView toEdit(Integer id) {
		ModelAndView mv = null;
		try {
			SysCode code = this.service.getByPrimaryKey(id);
			mv = new ModelAndView();
			mv.addObject(ModelAndViewConstants.OPERATION_KEY, ModelAndViewConstants.OPERATION_VALUE_EDIT);
			mv.addObject(ModelAndViewConstants.CODE_MODEL, code);
			mv.addObject(ModelAndViewConstants.TITLE_KEY, "修改码表");
			mv.setViewName(ModelAndViewConstants.CODE_EDIT_VIEW);
			LogService.getInstance(this).debug("进入码表编辑页：" + ModelAndViewConstants.ROLE_EDIT_VIEW);
		} catch (Exception ex) {
			LogService.getInstance(this).error("码表编辑失败：" + ex.getMessage(), ex);
			mv = new ModelAndView(ModelAndViewConstants.ERROR_VIEW);
		}
		return mv;
	}

	/**
	 * 功能说明：执行命名验证 修改说明：
	 * 
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:23:35
	 * @param codeName
	 * @param op
	 * @param original
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doNameValidate")
	public Map<String, Object> doNameValidate(String codeName, String op, String original) {
		Map<String, Object> jsonResult = null;
		try {
			String where = " BINARY CodeName='" + codeName + "' and Status='0' ";
			List<SysCode> list = this.service.getByWhere(where);
			if (list != null) {
				int count = list.size();
				switch (count) {
				case 0:
					jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该码名称可以使用");
					LogService.getInstance(this).debug("码名称验证通过，可使用");
					break;
				case 1:
					if (ModelAndViewConstants.OPERATION_VALUE_EDIT.equals(op)) {
						if (codeName.equals(original)) {
							jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该码名称可以使用");
							LogService.getInstance(this).debug("码名称验证通过，可使用");
						} else {
							jsonResult = JsonResult.jsonValidateReturn(false, "该码名称已被使用");
							LogService.getInstance(this).debug("码名称已被使用，不可使用");
						}
					} else {
						jsonResult = JsonResult.jsonValidateReturn(false, "该码名称已被使用");
						LogService.getInstance(this).debug("码名称已被使用，不可使用");
					}
					break;
				default:
					jsonResult = JsonResult.jsonValidateReturn(false, "该码名称已被使用");
					LogService.getInstance(this).debug("码名称已被使用，不可使用");
					break;
				}
			} else {
				jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
				LogService.getInstance(this).error("码名称验证失败");
			}
		} catch (Exception e) {
			jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
			LogService.getInstance(this).error("码名称验证失败");
		}
		return jsonResult;
	}

	/**
	 * 功能说明：执行值验证 修改说明：
	 * 
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:24:16
	 * @param codeValue
	 * @param op
	 * @param original
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doValueValidate")
	public Map<String, Object> doValueValidate(String codeValue, String op, String original) {
		Map<String, Object> jsonResult = null;
		try {
			String where = " BINARY CodeValue='" + codeValue + "' and Status='0' ";
			List<SysCode> list = this.service.getByWhere(where);
			Integer count = (list == null || list.isEmpty()) ? 0 : list.size();
			switch (count) {
			case 0:
				jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该码值可以使用");
				LogService.getInstance(this).debug("码值验证通过，可使用");
				break;
			case 1:
				if (ModelAndViewConstants.OPERATION_VALUE_EDIT.equals(op)) {
					if (codeValue.equals(original)) {
						jsonResult = JsonResult.jsonValidateReturn(true, "验证通过，该码值可以使用");
						LogService.getInstance(this).debug("码值验证通过，可使用");
					} else {
						jsonResult = JsonResult.jsonValidateReturn(false, "该码值已被使用");
						LogService.getInstance(this).debug("码值已被使用，不可使用");
					}
				} else {
					jsonResult = JsonResult.jsonValidateReturn(false, "该码值已被使用");
					LogService.getInstance(this).debug("码值已被使用，不可使用");
				}
				break;
			default:
				jsonResult = JsonResult.jsonValidateReturn(false, "该码值已被使用");
				LogService.getInstance(this).debug("码值已被使用，不可使用");
				break;
			}
		} catch (Exception e) {
			jsonResult = JsonResult.jsonValidateReturn(false, "验证失败");
			LogService.getInstance(this).error("码值验证失败");
		}
		return jsonResult;
	}

	/**
	 * 功能说明：执行删除操作 修改说明：
	 * 
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:24:48
	 * @param id
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doDel")
	public Map<String, Object> toDel(Integer id) {
		Map<String, Object> jsonResult = null;
		try {
			SysCode role = new SysCode();
			role.setId(id);
			role.setStatus(Constants.PERSISTENCE_DELETE_STATUS);
			Integer count = this.service.updateByPrimaryKey(role);
			String tabid = tabid(ModelAndViewConstants.CODE_SYS_ID);
			if (count > 0) {
				Integer statusCode = 200;
				String msg = "码表值删除成功";
				jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid, false, "", "");
				LogService.getInstance(this).debug("删除码表值成功，数量：" + count);
			} else {
				String msg = "该数据已删除，请核对数据正确性，或重新刷新数据尝试。";
				jsonResult = JsonResult.jsonReturnErr(msg);
				LogService.getInstance(this).debug("删除码表值失败，数量：" + count);
			}
		} catch (Exception ex) {
			String msg = "删除失败";
			jsonResult = JsonResult.jsonReturnErr(msg);
			LogService.getInstance(this).error("码表值删除失败：" + ex.getMessage(), ex);
		}
		return jsonResult;
	}

	/**
	 * 功能说明：对添加和编辑执行保存操作 修改说明：
	 * 
	 * @author zhenglibing
	 * @date 2017年10月15日 下午12:25:27
	 * @param code
	 * @param op
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/doSave")
	public Map<String, Object> doSave(SysCode code, String op) {
		Map<String, Object> jsonResult = null;
		try {
			/**
			 * 添加操作
			 */
			String tabid = tabid(ModelAndViewConstants.CODE_SYS_ID);
			if (null == op || ModelAndViewConstants.OPERATION_VALUE_ADD.equals(op)) {
				code.setStatus("0");
				this.service.insert(code);
				Integer statusCode = 200;
				String msg = "码值添加成功";
				jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid);
				LogService.getInstance(this).debug("添加码值成功!");
			} else {
				this.service.updateByPrimaryKey(code);
				Integer statusCode = 200;
				String msg = "码值修改信息成功";
				jsonResult = JsonResult.jsonReturn(statusCode.intValue(), msg, tabid);
				LogService.getInstance(this).debug("编辑码值信息成功!");
			}
		} catch (Exception e) {
			String msg = "保存码值信息失败" + e.getMessage();
			jsonResult = JsonResult.jsonReturnErr(msg);
			LogService.getInstance(this).debug("保存码值信息失败!" + e.getMessage());
		}
		return jsonResult;
	}
	/**
	 * 
	 * 功能说明：根据codeType获取码表值
	 * 修改说明：
	 * @author 袁海涛
	 * @date 2018年5月14日 上午9:48:06
	 * @param sysCode
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/getByCodeType")
     public Json<List<SysCode>>  getByCodeType( SysCode sysCode) {
		try {
			Map whereMap = new HashMap();
			whereMap.put("status", 0);
			whereMap.put("codeType", sysCode.getCodeType());
			List<SysCode> codeList = this.service.getByWhere(whereMap);
			LogService.getInstance(this).info("机场信息查询成功");
			return new Json<List<SysCode>>().success(codeList);
		} catch (Exception e) {
			LogService.getInstance(this).error("获取码值异常",e);
			return new Json<List<SysCode>>().fail();
		}
	}
}
